项目中有时候会出现冷启动缓慢白屏过长现象. 今天我们探究另外一种解决方式——IntentService异步处理,新开线程。接下来我们就来看一下app冷启动缓慢出现白屏之IntentService解决方案,希望对大家有所帮助。
于亚豪的博客地址
什么叫做冷启动
第一次启动或者被用户主动杀死app进程,或者被系统主动回收掉,整个app的后台任务被清理,回到桌面再次点击app的桌面图标启动app。
特点
后台任务全部结束,再次启动
当然还有与之对应的热启动
热启动
用户点击返回键退推到桌面上,后台任务没有被杀死。再次点击桌面图标启动app
特点
未清理后台任务,再次启动
app启动时,每一个app都会至少创建一个进程出来,一些启动多线程任务的会创建出来多个进程。
为什么会出现白屏现象
首先我们要知道当打开一个Activity的时候发生了什么?
在一个Activity打开时,如果该Activity所属的Application还没有启动,那么系统会为这个Activity创建一个进程
每创建一个进程都会调用一次Application,所以Application的onCreate()方法可能会被调用多次
在进程的创建和初始化中,势必会消耗一些时间,在这个时间里,WindowManager会先加载APP里的主题样式里的窗口背景(windowBackground)作为预览元素,然后才去真正的加载布局
如果这个时间过长,而默认的背景又是黑色或者白色,这样会给用户造成一种错觉,这个APP很卡,很不流畅,自然也影响了用户体验。
效果图对比较:
启动过长出现白屏效果:
利用IntentService优化后的效果:
在application里做一些耗时的一些逻辑:
利用IntentService进行帮助application逻辑相关的异步处理
application相关处理
MyIntentService:
该项目是一个关于GreenDao的一个学习案例:
相关该用例中的demo相关CSDN连接:
另外参考了网上的另外2种方式这里也进行总结一下.
<style name="AppWelcome" parent="AppTheme">
<item name="android:windowBackground">@mipmap/bg_welcome_start</item>
</style>
<style name="Appwelcome" parent="android:Theme.Translucent.NoTitleBar.Fullscreen"/>
透明化这种做法需要注意的一点,如果直接把Theme引入Activity,在运行的时候可能会出现如下异常:
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
这个是因为使用了不兼容的Theme,例如我这里的Activity继承了AppCompatActivity,解决方案很简单:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
}
}
最后别忘了两种方式都要在 我们都需要将Theme引入对应的Activity
<activity
android:name=".app.main.MainActivity"
android:theme="@style/AppWelcome"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。
IntentService有以下特点:
它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
创建了一个工作队列,来逐个发送intent给onHandleIntent()。
不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
默认实现的onBind()返回null
默认实现的onStartCommand()的目的是将intent插入到工作队列中
这次主要是针对于APP第一次启动过长 出现白屏的解决方案.
如何避免app启动时间过长呢?
另外性能分析工具请参考:
BlockCannery-一个强大的Android程序调试工具,轻松帮你找出卡顿
性能优化篇:
Android性能优化 (1)—— 内存溢出和内存泄漏的介绍
博客地址:
让心,在阳光下学会舞蹈
让灵魂,在痛苦中学会微笑
—终端研发部—
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部
(欢迎关注学习和交流)
(欢迎关注学习和交流)